#ifndef DATACENTER_H
#define DATACENTER_H

#include <QObject>
#include<QStandardPaths>
#include<QJsonObject>
#include<QJsonDocument>
#include<QDir>

#include"data.h"
#include"../network/netclient.h"

namespace model{

class DataCenter : public QObject
{
    Q_OBJECT
private:
    // 登录会话id
    // 这个信息是登录成功后, 服务器返回的.
    // 返回之后这个数据需要被客⼾端持久化保存在⽂件中.
    // 后续每次启动, 都从⽂件中拿到这个内容.
    // 当⽤⼾显式点击 "退出登录", 则删除这个信息.
    QString loginSessionId = "";
    // 当前⽤⼾信息
    UserInfo* myself = nullptr;
    // 当前⽤⼾的好友列表
    QList<UserInfo>* friendList = nullptr;
    // 当前⽤⼾的会话列表
    QList<ChatSessionInfo>* chatSessionList = nullptr;
    // 当前⽤⼾选择的消息会话 id
    QString currentChatSessionId = "";
    // 待处理的好友申请列表
    QList<UserInfo>* applyList = nullptr;
    // 每个会话中的⽤⼾列表
    QHash<QString, QList<UserInfo>>* memberList = nullptr;
    // 当前⽤⼾的消息内容, key 为 ChatSessionInfo 的 chatSessionId
    QHash<QString, QList<Message>>* recentMessages = nullptr;
    // 未读消息数⽬的统计, key 为 ChatSessionInfo 的 chatSessionId, value 为未读消息个数
    QHash<QString, int>* unreadMessageCount = nullptr;
    // ⽤⼾搜索结果
    QList<UserInfo>* searchUserResult = nullptr;
    // 当前历史消息搜索结果
    QList<Message>* searchMessageResult = nullptr;
    // 当前短信验证码的验证 id
    QString currentVerifyCodeId = "";
    // 持有⽹络通信客⼾端
    network::NetClient netClient;
    // 构造单例模式
    static DataCenter* instance;
    DataCenter();
public:
    static DataCenter* getInstance();
    ~DataCenter();
    // 初始化数据⽂件
    void initDataFile();
    // 保存必要的数据到⽂件
    void saveDataFile();
    // 从⽂件加载必要的数据
    void loadDataFile();

    //获取到当前的登录会话id
    const QString& getLoginSessionId();

    //验证网络连通性
    void ping(){netClient.ping();}

    //获取个人信息
    UserInfo* getMyselfInfo();
    //通过网络获取个人信息
    void getMyselfInfoAsync();
    void setMySelfInfo(std::shared_ptr<lx::GetUserInfoRsp> resp);

    //获取好友列表
    QList<model::UserInfo>* getFriendList();
    //从网络获取好友列表
    void getFriendListAsync();
    //设置数据
    void setFriendList(std::shared_ptr<lx::GetFriendListRsp> resp);

    //获取会话列表
    QList<model::ChatSessionInfo>* getSessionList();
    //从网络获取会话列表
    void getSessionListAsync();
    //设置数据
    void setSessionList(std::shared_ptr<lx::GetChatSessionListRsp> resp);

    //获取好友申请列表
    QList<UserInfo>* getApplyList();
    //从网络获取好友申请列表
    void getApplyListAsync();
    //设置数据
    void setApplyList(std::shared_ptr<lx::GetPendingFriendEventListRsp> resp);

    //获取最近消息
    QList<Message>* getRecentMessages(const QString& chatSessionId);
    //从网络获取最近消息
    void getRencentMessagesAsync(const QString& chatSessionId, bool isUpdateUI);
    //设置数据
    void setRecentMessages(const QString& chatSessionId, std::shared_ptr<lx::GetRecentMsgRsp> resp);
    model::ChatSessionInfo* getChatSessionInfo(const QString& chatSessioId);

    //保存当前被选中的会话
    void setCurrentChatSessionId(const QString& chatSessionId);
    //获取当前被选中的会话
    const QString&  getCurrentChatSessionId();

    //通过userId获取会话
    const ChatSessionInfo* getChatSessionInfoByUserId(const QString& userId);
    //将指定会话置顶
    void topChatSessionInfo(ChatSessionInfo chatSessionInfo);

    //发送消息
    void sendTextMessageAsync(const QString& chatSessionId, const QString& content);
    //添加一条消息
    void addMessage(const model::Message& message);
    //添加未读消息数
    void addUnread(const QString& chatSessionId);
    //清空未读消息数
    void clearUnread(const QString& chatSessionId);
    //获取到未读消息数
    int getUnread(const QString &chatSessionId);

    //获取消息
    void receiveMessage(const QString& chatSessionId);

    //修改名字
    void changeNickNameAsync(const QString& name);
    void setName(const QString& name);

    //修改标签
    void changeDescriptionAsync(const QString& description);
    void setDescription(const QString& description);

    //修改手机号码
    void getVerifyCodeAsync(const QString& phone);
    void setPhone(const QString& phone);
    void setVerifyCodeId(const QString& verifyCodeId);
    const QString& getVerifyCodeId();
    void changePhoneAsync(const QString &phone, const QString& verifyCodeId, const QString& verifyCode);

    //修改头像
    void changeAvatarAsync(const QByteArray& avatar);
    void setAvatar(const QByteArray& avatar);

    //获取好友id
    model::UserInfo* getFriendById(const QString& userId);

    //删除好友
    void deleteFriendAsync(const QString& userId);
    void removeFriend(const QString& userId);

    //好友申请
    void addFriendApplyAsync(const QString& userId);

    //同意好友申请
    void acceptFriendApplyAsync(const QString& userId);
    //从申请列表中移除
    model::UserInfo removeFromApplyList(const QString& userId);

    //拒绝好友申请
    void rejectFriendApplyAsync(const QString& userId);

    //通过userId获取用户信息
    model::UserInfo* getUserInfoByuserId(const QString& userId);

    //创建会话
    void createChatSessionAsync(const QList<QString>& userIdList);

    //获取群聊成员信息
    void getMemberListAsync(const QString& chatSessionId);
    void setMemberList(const QString& chatSessionId, std::shared_ptr<lx::GetChatSessionMemberRsp> resp);
    QList<model::UserInfo>* getMemberList(const QString& chatSessionId);

    //搜索用户
    void searchUserAsync(const QString& searchKey);
    void setSearchUserResult(std::shared_ptr<lx::FriendSearchRsp> resp);
    QList<UserInfo>* getSearchUserResult();

    //按照关键词搜索历史消息
    void searchMessageAsync(const QString& searchKey);
    void setSearchMessageResult(const QList<lx::MessageInfo>& msgList);
    QList<model::Message>* getSearchMessageResult();

    //按照时间搜索历史消息
    void searchMessageByTimeAsync(const QDateTime begTime, const QDateTime endTime);

    //用户账号和密码登录注册
    //用户登录
    void userLoginAsync(const QString& username, const QString& password);
    void setLoginSessionId(const QString& loginSessionId);
    //用户注册
    void userRegisterAsync(const QString& username, const QString& password);

    //通过手机号和手机验证码登录注册
    void phoneLoginAsync(const QString& phone, const QString& phoneVerifyCode);
    void phoneRegisterAsync(const QString& phone, const QString& phoneVerifyCode);

signals:
    //获取个人信息信号
    void getMyselfInfoDone();

    //获取好友列表
    void getFriendListDone();

    //获取会话列表
    void getSessionListDone();

    //获取好友申请列表
    void getApplyListDone();

    //获取最近消息
    void getRecentMessagesDone(const QString& chatSessionId);
    void getRecentMessagesDoneNoUI(const QString& chatSessionId);

    //发送消息
    void sendMessageDone(model::MessageType messageType, const QByteArray& content, const QString& extraInfo);
    void sendMessageFailed(const QString& errmsg);
    //更新会话列表中的最近一条消息
    void updateLastMessage(const QString& chatSessionId);

    //收到一条新消息
    void receiveMessageDone(const model::Message& message);

    //修改名字
    void changeNickNameDone();

    //修改标签
    void changeDescriptionDone();

    //获取手机验证码
    void getVerifyCodeDone();
    void changePhoneDone();

    //修改头像
    void changeAvatarDone();

    //删除好友
    void deleteFriendDone(const QString& userId);
    void clearCurrentSession();

    //好友申请
    void addFriendApplyDone();
    void receiveFriendApplyDone();

    //同意好友申请
    void acceptFriendApplyDone(const QString& userId, const QString& reason);

    //拒绝好友申请
    void rejectFriendApplyDone(const QString& userId, const QString& reason);

    //好友申请被同意
    void receiveFriendProcessAccept(const model::UserInfo& userInfo);
    //好友申请被拒绝
    void receiveFriendProcessReject(const model::UserInfo& userInfo);

    //创建会话
    void createChatSessionDone();
    void receiveSessionCreateDone();

    //获取群聊会话成员信息
    void getMemberListDone(const QString& chatSessionId);

    //搜索用户
    void searchUserDone();

    //通过关键字搜索历史消息
    void searchMessageDone();

    //用户账号和密码登录注册
    //用户登录
    void userLoginDone(bool ok, const QString& reason);
    //用户注册
    void userRegisterDone(bool ok, const QString& reason);

    //通过手机号和手机验证码登录注册
    void phoneLoginDone(bool ok, const QString& reason);
    void phoneRegisterDone(bool ok, const QString& reason);

};

}

#endif // DATACENTER_H
